package dao

import (
	"gitee.com/gopher2011/mbt"
	"time"
)

// 这是 User 的全局公开dao对象，被service层调用!
var UserDao = userDao{}

// 用户信息表
// 这是 user表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type User struct {
	Uid         int32     `json:"uid" form:"uid" db:"uid" v:"uid"`
	Email       string    `json:"email" form:"email" db:"email" v:"email"`
	Open        int8      `json:"open" form:"open" db:"open" v:"open"`                             // 邮箱是否公开,默认不公开
	Username    string    `json:"username" form:"username" db:"username" v:"username"`             // 用户名
	Name        string    `json:"name" form:"name" db:"name" v:"name"`                             // 姓名
	Avatar      string    `json:"avatar" form:"avatar" db:"avatar" v:"avatar"`                     // 头像(如果为空,则使用http://www.gravatar.com
	City        string    `json:"city" form:"city" db:"city" v:"city"`                             // 居住地
	Company     string    `json:"company" form:"company" db:"company" v:"company"`                 // 公司
	Github      string    `json:"github" form:"github" db:"github" v:"github"`                     // github昵称
	Gitea       string    `json:"gitea" form:"gitea" db:"gitea" v:"gitea"`                         // gitea昵称
	Weibo       string    `json:"weibo" form:"weibo" db:"weibo" v:"weibo"`                         // 微博昵称
	Website     string    `json:"website" form:"website" db:"website" v:"website"`                 // 个人主页,博客
	Signature   string    `json:"signature" form:"signature" db:"signature" v:"signature"`         // 个人状态,签名,独白
	Introduce   string    `json:"introduce" form:"introduce" db:"introduce" v:"introduce"`         // 个人简介
	Unsubscribe int8      `json:"unsubscribe" form:"unsubscribe" db:"unsubscribe" v:"unsubscribe"` // 是否退订本站邮件,0-否,1-是
	IsThird     int8      `json:"is_third" form:"is_third" db:"is_third" v:"is_third"`             // 是否通过第三方账号注册
	Balance     int32     `json:"balance" form:"balance" db:"balance" v:"balance"`                 // 财富余额(铜币)
	IsAuth      int32     `json:"is_auth" form:"is_auth" db:"is_auth" v:"is_auth"`                 // 控制用户权限,如能否发文章等
	IsVip       int8      `json:"is_vip" form:"is_vip" db:"is_vip" v:"is_vip"`                     // 是否是VIP付费用户
	VipExpire   int32     `json:"vip_expire" form:"vip_expire" db:"vip_expire" v:"vip_expire"`     // VIP到期日期,格式20200301
	Status      int8      `json:"status" form:"status" db:"status" v:"status"`                     // 用户账号状态,0-默认,1-已审核,2-拒绝,3-冻结,4-停号
	IsRoot      bool      `json:"is_root" form:"is_root" db:"is_root" v:"is_root"`                 // 是否是超级用户,不受权限控制:1-是
	Ctime       time.Time `json:"ctime" form:"ctime" db:"ctime" v:"ctime"`
	Mtime       time.Time `json:"mtime" form:"mtime" db:"mtime" v:"mtime"`
}
// 注意:这是 User 的私有dao对象，只能在dao层内使用!
type userDao struct {
	Tx             mbt.Tx
	InsertTemplate func(arg User, s mbt.Session) (int64, error) //插入一条记录
	UpdateTemplate func(arg User) (int64, error)                //更新一条记录
	DeleteTemplate func(id int64) (int64, error)                `arg:"id"` //根据传入的主键删除一条记录
	SelectTemplate func(id int64) (User, error)                 `arg:"id"` //根据传入的主键获取一条记录
	List           func(arg UserList) ([]User, error)           //模糊分页查询

	FindDefaultAvatar func() ([]DefaultAvatar, error)
	Total             func(uid int) (int64, error) `arg:"uid"`

	FindLoginMission  func(uid int)(UserLoginMission,error)`arg:"uid"`
}


// 这是 user 表的批量请求参数
type UserReq struct {
	List []User `json:"list" form:"list"`
}

// 这是 userDao.List()方法的请求参数
type UserList struct {
	Page
}

// Me 代表当前用户
type Me struct {
	Uid int `json:"uid"`
	Username string `json:"username"`
	Name string `json:"name"`
	MonLog string `json:"mon_log"`
	Email string `json:"email"`
	Avatar string `json:"avatar"`
	Status int `json:"status"`
	MsgNum int `json:"msg_num"`
	IsAdmin bool `json:"is_admin"`
	IsRoot bool `json:"is_root"`
	DauAuth int `json:"dau_auth"`
	IsVip bool `json:"is_vip"`
	Balance int `json:"balance"`
	Gold int `json:"gold"`
	Silver int `json:"silver"`
	Copper int `json:"copper"`
	RoleIds []int `json:"-"`
	CreateAt time.Time `json:"create_at"`
}
// 用户登陆表
// 这是 user_login表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type UserLogin struct {
	Uid       int32     `json:"uid" form:"uid" db:"uid" v:"uid"`
	Email     string    `json:"email" form:"email" db:"email" v:"email"`
	Username  string    `json:"username" form:"username" db:"username" v:"username"`         // 用户名
	Passcode  string    `json:"passcode" form:"passcode" db:"passcode" v:"passcode"`         // 加密随机数
	Passwd    string    `json:"passwd" form:"passwd" db:"passwd" v:"passwd"`                 // md5密码
	LoginIp   string    `json:"login_ip" form:"login_ip" db:"login_ip" v:"login_ip"`         // 最后登陆 IP
	LoginTime time.Time `json:"login_time" form:"login_time" db:"login_time" v:"login_time"` // 最后一次登陆时间(主动登陆或cookie登陆)
}

// 活跃用户表
// 这是 user_active表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type UserActive struct {
	Uid      int32     `json:"uid" form:"uid" db:"uid" v:"uid"`
	Email    string    `json:"email" form:"email" db:"email" v:"email"`
	Username string    `json:"username" form:"username" db:"username" v:"username"` // 用户名
	Weight   int16     `json:"weight" form:"weight" db:"weight" v:"weight"`         // 活跃度,越大越活跃
	Avatar   string    `json:"avatar" form:"avatar" db:"avatar" v:"avatar"`         // 头像(如果为空,则使用http://www.gravatar.com
	Mtime    time.Time `json:"mtime" form:"mtime" db:"mtime" v:"mtime"`
}

// 用户角色表(用户是什么角色,可以多个角色)
// 这是 user_role表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type UserRole struct {
	Uid    int32     `json:"uid" form:"uid" db:"uid" v:"uid"`
	RoleId int32     `json:"role_id" form:"role_id" db:"role_id" v:"role_id"`
	Ctime  time.Time `json:"ctime" form:"ctime" db:"ctime" v:"ctime"`
}

// 第三方绑定表
// 这是 bind_user表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type BindUser struct {
	Id           int32     `json:"id" form:"id" db:"id" v:"id"`
	Uid          int32     `json:"uid" form:"uid" db:"uid" v:"uid"`                                         // 本站用户UID
	Type         int8      `json:"type" form:"type" db:"type" v:"type"`                                     // 绑定的第三方类型,0-github
	Email        string    `json:"email" form:"email" db:"email" v:"email"`                                 // 第三方邮箱
	ThirdUid     int32     `json:"third_uid" form:"third_uid" db:"third_uid" v:"third_uid"`                 // 第三方uid
	Username     string    `json:"username" form:"username" db:"username" v:"username"`                     // 第三方用户名
	Name         string    `json:"name" form:"name" db:"name" v:"name"`                                     // 姓名
	AccessToken  string    `json:"access_token" form:"access_token" db:"access_token" v:"access_token"`     // 第三方access_token
	RefreshToken string    `json:"refresh_token" form:"refresh_token" db:"refresh_token" v:"refresh_token"` // 第三方refresh_token
	Expire       int32     `json:"expire" form:"expire" db:"expire" v:"expire"`                             // 过期时间
	Avatar       string    `json:"avatar" form:"avatar" db:"avatar" v:"avatar"`                             // 第三方头像
	CreatedAt    time.Time `json:"created_at" form:"created_at" db:"created_at" v:"created_at"`
}

const (
	// 用户拥有的权限设置
	DauAuthTopic = 1 << iota

)

const (
	KeyNewUserWait = "new_user_wait" // 新用户注册多久才能发布帖子，单位秒，0表示没限制
	KeyCanEditTime = "can_edit_time" // 发布后多久内能够编辑，单位秒
	KeyPublishTimes = "publish_times" //一天发布次数大于该值，需要验证码
	KeyPublishInterval = "publish_interval" // 发布时间间隔在该值内，需要验证码，单位秒
)

// 用户设置
// 这是 user_setting表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type UserSetting struct {
	Id     int    `json:"id" form:"id" db:"id" v:"id"`
	Key    string `json:"key" form:"key" db:"key" v:"key"`             // 配置项名称
	Value  int    `json:"value" form:"value" db:"value" v:"value"`     // 配置项值
	Remark string `json:"remark" form:"remark" db:"remark" v:"remark"` // 配置项说明
}

// 默认头像
// 这是 default_avatar表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type DefaultAvatar struct {
	Id        int32     `json:"id" form:"id" db:"id" v:"id"`
	Filename  string    `json:"filename" form:"filename" db:"filename" v:"filename"` // 图像文件名
	CreatedAt time.Time `json:"created_at" form:"created_at" db:"created_at" v:"created_at"`
}

// 用户登陆任务
// 这是 user_login_mission表 的实体类,这个实体类中的字段可以减少，但是不能在其基础上增加!
type UserLoginMission struct {
	Uid       int       `json:"uid" form:"uid" db:"uid" v:"uid"`                             // 用户UID
	Date      int       `json:"date" form:"date" db:"date" v:"date"`                         // 最新领取日期
	Award     int       `json:"award" form:"award" db:"award" v:"award"`                     // 最新领取的奖励(铜币)
	Days      int       `json:"days" form:"days" db:"days" v:"days"`                         // 连续登陆领取天数
	TotalDays int       `json:"total_days" form:"total_days" db:"total_days" v:"total_days"` // 总登陆领取天数
	UpdatedAt time.Time `json:"updated_at" form:"updated_at" db:"updated_at" v:"updated_at"`
}